import Module from "./module";
import { forEachValue } from "../utils";
// 树型格式化用户数据
export default class ModuleCollection {
  constructor(rootModule) {
    // 根节点
    this.root = null;
    // 递归处理子模块
    this.register([], rootModule);
  };
  // 递归处理子模块
  register(path, rawModule) {
    // 生成模块
    const newModule = new Module(rawModule);
    // 空的说明是根root
    if (path.length == 0) {
      // 创建模块
      this.root = newModule;
    } else {
      // 循环找父节点,为父节点添加这个子节点
      const parent = path.slice(0, -1).reduce((module, current) => {
        return module.getChild(current);
      }, this.root);
      // 为父亲添加此节点
      parent.addChild(path[path.length - 1], newModule);
    }
    // 如果有rawModule.modules就递归处理
    if (rawModule.modules) {
      forEachValue(rawModule.modules, (rawChildModule, key) => {
        // 要用concat拼接返个新数组,不破坏之前的引用
        this.register(path.concat(key), rawChildModule);
      });
    }
    // 把新模块返回
    return newModule;
  }
  // 获取命名空间
  getNamespaced(path) {
    let module = this.root;
    return path.reduce((namespaceStr, key) => {
      // 找到下一个子节点
      module = module.getChild(key);
      // 拼接命名空间,有命名空间就拼,没有就不管
      return namespaceStr + (module.namespaced ? key + '/' : '');
    }, '');
  }
}